←
▼
▲
その他
タスクに登録する
←
▼
▲
インターネットからダウンロードします。
ファイアウォールをチェックします。
仮想ファイル・サーバーを設定します。
% 文字を使った正規の URL に変換します。
ホームページを開きます。
他にもあります。左のツリーから選択してください。
←
▼
▲
Sub DownloadByHttp( DownloadURL as string, OutLocalPath as string )
インターネットからダウンロードします。
【引数】
DownloadURL
OutLocalPath
ダウンロードする URL、または、その配列
ダウンロードしたファイルの保存先パス
デフォルトでは、Sage Plaisir 21 のホームページからダウンロードするときのみ、
ユーザーの許可を確認することなくダウンロードできます。 他のホームページ
からダウンロードするときは、ユーザーの許可を求められます。
他のホームページからダウンロードする処理を含むスクリプトを使って自動化する
ときは、ユーザーの許可を求めない exe を作成する必要があります。 デフォルト
では、ダウンロードを実際に行うのは、scriptlib\vbslibXXX\sage_p_downloader に
入っている sage_p_downloader.exe ですが、_src\Test\vbslib_test\scriptlib\
vbslib\sage_p_downloader\src にソースが含まれているので、
修正は簡単です。 ソースに記述されたダウンロードできるドメインを
変更し、再コンパイルし、exe 名を変更して、Netword.vbs にある DownloadByHttp
の定義を編集してください。 exe 名を変更することで、ウィルス対策ソフトが
ネットワークアクセスの許可を再度行います。
→ T_Download.vbs
テスト
DownloadByHttp "http://www.sage-p.com/index.html", "index.html"
関連
DownloadURL には、URL に含むことができない文字も含むことができます。
内部で、GetPercentURL を呼び出しています。
ダウンロードを含む処理をするときは、SetVirtualFileServer を使えば、実際に
ネットワークにアクセスする前に、ローカル PC だけで動作確認ができます。
キーワード:
ソース
サンプル
→ Network.vbs
DownloadURL 引数が配列のときは、OutLocalPath はフォルダーのパスになります。
DownloadURL 引数が配列のときは、実行後は、DownloadURL 配列の内容が、
保存先のファイルのパスに置き換わります。
T_SetVirtualFileServer
T_SetVirtualFileServer_Files
T_SetVirtualFileServer_Files_Manually
参考
→ src フォルダー
sage_p_downloader.exe のソース
←
▼
▲
Sub SetVirtualFileServer_byXML( SettingXML_Path as string )
による仮想ファイル・サーバーの設定を XML ファイルで行います。
【引数】
SettingXML_Path
仮想ファイル・サーバーの設定がある XML ファイル、または、Empty
SetVirtualFileServer_byXML GetVar("%VirtualServer%")
サンプル
環境変数 VirtualServer が定義されていれば、その値を XML ファイルのパスとして設定します。
定義されていなければ、仮想ファイル・サーバーを使いません。
SettingXML_Path = Empty のときは、仮想ファイル・サーバーを使わないようになります。
既に仮想ファイル・サーバーが登録されていたときも、その登録は解除されます。
ソース
テスト
XML ファイルの例
<VirtualFileServer>
<Replace from="http://www.sage-p.com/" to="http://www.sage-p.com/test/" />
<Replace from="http://www.sage-p.com/files/" to="C:\www_sage-p_com\files\" />
<Replace from="http://www.sage-p.com/download"/>
</VirtualFileServer>
キーワード:
Replace/@from
の VirtualURL 引数に渡す値
Replace/@to
の LocalOrOtherPath 引数に渡す値。
省略時は、Empty を渡します。
これまで登録されていた仮想ファイル・サーバーの設定は登録解除されます。
→ T_Download.vbs
T_SetVirtualFileServer_byXML
→ Network.vbs
参考
←
▼
▲
Sub SetVirtualFileServer( VirtualURL as string, LocalOrOtherPath as string )
ネットワーク・サーバーの代わり(仮想ファイル・サーバー)を設定します。
【引数】
VirtualURL
LocalOrOtherPath
仮想ファイル・サーバーが応答するベース URL
VirtualURL に対応するローカルのパス、または URL
SetVirtualFileServer を使うと、
を呼び出しても、インターネットからダウン
ロードせず、設定したローカル・フォルダからコピーするか、別の URL からダウンロードします。
この機能により、一般公開されているサーバーを変更しないでテストができます。
SetVirtualFileServer "http://www.sage-p.com/", "C:\www_sage-p_com\"
DownloadByHttp "http://www.sage-p.com/index_test.html", "index.html"
ソース
サンプル
→ Network.vbs
通常、VirtualURL の最後が、/ なら、LocalPath の最後は \ または / にしてください。
既に仮想ファイル・サーバーが登録されているときに呼び出すと、追加登録されます。
LocalOrOtherPath = Empty を指定すると、VirtualURL の URL に対して、仮想ファイル・サーバーを
使わないようになります。
VirtualURL = Empty を指定すると、すべての仮想ファイル・サーバーを使わないようになります。
テスト
LocalOrOtherPath は、ローカル PC にあるフォルダーのパス、または、別の URL を指定します。
LocalOrOtherPath に "://" があると、別の URL が指定されたとして、ダウンロードします。
関連
←
▼
▲
次の文字(特殊な予約文字)は、区切り文字や予約文字ではなくすために、% にエスケープします。
・[ ] @ // RFC3986 の gen-delims
・ただし、query と fragment の @ は、エスケープしません。
・! $ & ' ( ) * + , ; = // RFC3986 の sub-delims。
・ただし、query と fragment の sub-delims は、エスケープしません。
・% < > // RFC3986 にはあるが、reserved になっていない予約文字
Function GetPercentURL( UnicodeURL as string ) as string
基本的な URL の区切り文字(:/?#)以外の予約文字を、% 文字を使った URL にエンコードします。
【引数】
UnicodeURL
基本的な URL の区切り文字だけを考慮した URL
返り値
実際に URL に使える文字だけを使った URL
url = GetPercentURL( "http://www.sage-p.com/download file.zip" )
url は、 "http://www.sage-p.com/download%20file.zip" になります。
2
!
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
1
0
3
4
5
6
7
"
#
$
%
&
'
(
)
*
+
,
-
.
/
0
1
9
8
7
6
5
4
3
2
:
;
<
=
>
?
@
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
[
\
]
^
_
`
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
{
|
}
~
CR
LF
6
5
4
3
0
1
2
7
spc
参考
Windows のフォルダー区切り文字 \(バックスラッシュ) は、通常、URL にするときに / に
置き換えますが、URL では定義されていません。
fooooooo://example.com:8042/over/there?name=ferret#nose
(scheme) ( authority )( path ) ( query ) ( fragment )
サンプル
ソース
→ Network.vbs
関連
テスト
→ T_Download.vbs
T_GetPercentURL
→ ECMAScript - encodeURIComponent
URL の仕様に出てこない文字(使えない文字 "^\{|})
URL が使う一般的な予約文字 (gen-delims :/?#[]@)
URL が文字として使う文字 (unreserved A0-._~)
URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
hier-part = "//" authority path-abempty
/ path-absolute
/ path-rootless
/ path-empty
authority = [ userinfo "@" ] host [ ":" port ]
host = IP-literal / IPv4address / reg-name
reg-name = *( unreserved / pct-encoded / sub-delims )
path-abempty = *( "/" segment )
path-absolute = "/" [ segment-nz *( "/" segment ) ]
path-rootless = segment-nz *( "/" segment )
segment = *pchar
segment-nz = 1*pchar
query = *( pchar / "/" / "?" )
fragment = *( pchar / "/" / "?" )
pchar = unreserved / pct-encoded / sub-delims / ":" / "@"
unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
pct-encoded = "%" HEXDIG HEXDIG
reserved = gen-delims / sub-delims
gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@"
sub-delims = "!" / "$" / "&" / "'" / "(" / ")"
/ "*" / "+" / "," / ";" / "="
ALPHA = アルファベット
DIGIT = 数字
HEXDIG = 16進数の数字。 (Hex Digit)
参考
pct = percent, gen = general, delims = delimiters
→ ABNF 記法
以下に RFC 3986 の一部を示す。
RFC 3986 に基づいて URL (URI) に使える/使えない文字は、以下の通りです。
特殊な URL の予約文字 (sub-delims !$&'()*+,;=)
RFC 3986 では、unreserved と sub-delims が常に選択できる。
URL で定義がない予約文字(使えない文字 %<>)
Using <> angle brackets around each URI is especially recommended as
a delimiting style for a reference that contains embedded whitespace.
% は、pct-encoded の定義内で使われています。
< と > は、URL を囲む文字として使うことが推奨されています。 つまり、URL では使えません。
9 URI のエスケープ - RFC 3986 は、unreserved が減っていて読みにくくなる
(予約文字を踏まえずに多くの標準ができている身勝手な標準化委員への愚痴?)
本関数は、基本的な URL の予約文字 : / ? # はそのまま残し、それ以外の(特殊な)予約文字は
% 文字を使った文字列にエスケープします。 URL の ?query の部分の = と & は、クエリー文字列
のため、エスケープしません。 それ以外の部分の = と & は、エスケープします。
次の文字(基本的な予約文字)は、区切り文字として、エスケープしません。
・: / ? # // RFC3986 の ABNF のトップの定義にある gen-delims
ただし、最初の # より後の # はエスケープします。
詳細
基本的な予約文字で区切られた、それぞれの部分文字列(ファイル名、フォルダー名、URL の後の
ほうにある ?query の各変数の値や #fragment の部分) は、基本的な予約文字も含めてすべて
エスケープする必要があるので、本関数とは別の関数を使うとよいでしょう。
→ Punycode
ドメイン名の区切り(ピリオド)ごとに、Punycode 変換を行う。
→ URLエンコード (% 表記)
空白は + ではなく %20 に置き換えます。 Google でも正常に動きます。 + は、Google の検索
キーワードに入れるため %2B に置き換えます。
→ 検索キーワードの空白は +
次の文字は、RFC 3986 では明確にされていないため、% にエスケープします。
・Ascii 以外の文字 (漢字、Unicode 文字)
・" ^ { | } // \ 以外の RFC3986 で定義されていない文字、空白と制御文字
は展開しません。 文字 $, {, } がエスケープされます。 ${> } 変数の定義は不要です。
次の文字(英語の一般の文字)は、URL でも使えるので、エスケープしません。
・アルファベット、数字
\ 文字は、URL のフォルダー区切り記号 / に変換します。 RFC 3986 では明確にされていません。
・\
\ 文字は、URL のフォルダー区切り記号 / に変換します。 戻すときに \ か / のどちらであるか
→ CGIのパラーメータつきURL (?), query
参考
特殊な予約文字を返り値に含める(予約文字として使う)ときは、"${>" と "}" の間に埋め込んで
ください。 "${>" と、それに続く "}" は無くなります。
scheme, hier-part でエスケープ
上記の補足を踏まえて、文字ごとにまとめると、以下のようになります。
query の中にある sub-delims の文字は、クエリー文字列として有効にするため、エスケープしま
せん。 query の中の : / ? @ は、gen-delims ではありません。
fragment の中にある sub-delims の文字は、RFC 3986 では区切り文字ではないため、エスケープ
しません。 また、fragment の中の : / ? @ は、gen-delims ではありません。
scheme, hier-part, query, fragment でエスケープ
"${>" と "}" の間の文字は、どんな文字でもエスケープせず、"${>" とそれに続く "}" が
無くなります。 その後、$\ は $ に変換されます。 (最優先)
未対応
未対応
% 文字を使うようにエンコードした文字列は、% とそれに続く 2 文字(UTF-8 の16進数)を、
対応する 1 文字に変換するだけでデコードできます(戻ります)。 ただし、エンコード時に、
% も %25 に変換しておかなければ、デコードしても戻らなくなります。
% は1バイトしか変換できないので、文字コード セットの情報が別に無ければ、Ascii 以外の文字を
デコードしても戻らなくなります。 一般にUTF-8 が使われますが、Ascii 以外の文字に対して
UTF-16 より効率が悪い UTF-8 を使うのは、よく考えていないのでしょう。 2バイト文字は、
9バイト(UTF-8)、6バイト(UTF-16、Shift-JIS)になります。 つまり、4.5倍と3倍です。
は分からなくなります。 Windows のパス
に使うなどの状況で判断してください。
未対応
→ Punycode
は、% と文字コードではなく、Punycode に変換します。
は、2〜3倍に収まります。(本関数ではこの変換はしません)
←
▼
▲
Function DecodePercentURL( in_URL as string ) as string
% 文字を使った URL から、Unicode 文字を使った URL にデコードします。
【引数】
in_URL
% 文字を使った URL
返り値
Unicode 文字を使った URL
関連
ソース
→ vbslib.vbs
テスト
→ T_Download.vbs
T_GetPercentURL
←
▼
▲
Function LockByFileMutex( UNC_FilePath as string, TimeOut_msec as integer ) as FileMutexClass
ファイル・サーバーに対する排他制御を開始します。
【引数】
UNC_FilePath
排他制御を管理するファイルのパス
TimeOut_msec
タイムアウト(ミリ秒)、または、c.Forever
Set c = g_VBS_Lib
Set mutex = LockByFileMutex( "\\PC01\Folder\_Mutex.txt", c.Forever ) '// ロック開始
...
mutex = Empty '// ロック終了
ソース
サンプル
LockByFileMutex 関数の返り値です。
FileMutexClass のオブジェクトが削除されると、ロック状態を解除します。
Close メソッド(引数なし)を呼び出しても解除できます。
UNC_FilePath に、ファイル・サーバー、または、ローカルのファイルのパスを指定
してください。
指定したファイルには、ロックしているユーザー名 %USERDOMAIN%\%USERNAME%
(例:PC01\User1)が上書きされ、書き込み禁止、読み込み許可状態になります。
ロック状態を解除したら、ファイルを削除します。
→ T_FileMutex_Manually.vbs
テスト
→ Network.vbs
ロック状態を保持しているオブジェクト
返り値
←
▼
▲
→ CheckWSHNetwork フォルダ
WSH (wscript.exe, cscript.exe) に、ファイアウォールがネットワークアクセスを許可しているか
どうかをチェックするスクリプトです。
cscript.exe または wscript.exe に、ネットワークアクセスを許可すると危険かもしれませんが、
Windows7 のファイアウォールは、WSH によるネットワークアクセスをブロックしないで
実行できます。 (ダウンロードサーバーのドメインで識別するのかもしれません?)
CheckWSHNetwork.vbs をダブルクリックすると起動します。
←
▼
▲
vbs_inc.vbs
scriptlib
main
sample_lib
sample
vbs_inc ライブラリ本体
設定フォルダ
インクルードするライブラリのサンプル
は、インクルードの方向
scriptlib フォルダの中の vbs_inc.vbs ファイルの中にあり、内部的に使われます。
g_sh = WScript.CreateObject("WScript.Shell")
g_fs = CreateObject( "Scripting.FileSystemObject" )
vbs_inc.vbs のフル・パス
デバッガに接続しているかどうか(するかどうか)
→ g_IncludePathes
インクルードする VBS ファイルのパスの配列
コマンドプロンプトで実行するかどうか
scriptlib フォルダのフル・パス。末尾に \ が付く
vbs_inc の設定
に書かれた .vbs ファ
vbs_inc は、次のグローバル変数を定義しています。
起動時に管理者へログインするのかしないのか
複数の VBScript ファイルをインクルードするライブラリです。
コマンドライン(cscript.exe)で実行しているかどうか
古い関数でブレークするようにします。
バージョン番号の集合です。
vbs_inc.vbs があるフォルダのフル・パス。末尾に \ が付く
デバッガに接続するときのコマンドライン・パラメータ
参考
があるスクリプト・ファイルに、vbs_inc をインクルードするコード(vbslib include
を使って新規作成できるスクリプトなど
vbslib
)が必要です。 そのコードは、
に入っているので参考にしてください。
vbslib include は、scriptlib\setting フォルダーの中にある .vbs ファイル(通常、
vbs_inc_setting.vbs) に書かれた
イルをロードします。
関連
←
▼
▲
vbs_inc.vbs には、インクルードする vbslib のバージョンや、vbslib が入っているフォルダーを
選択して、vbslib をインクルードするスクリプトが書かれています。
g_vbslib_folder = g_fs.GetParentFolderName( g_vbslib_folder )
g_vbslib_folder = g_vbslib_folder + "\src\samples\scriptlib\"
g_vbslib_path = g_vbslib_folder +"vbs_inc.vbs"
vbslib が入っているフォルダーを変更するときは、上記の変数の設定(再設定)だけでなく、
も再設定してください。
インクルードする前に、次の変数に値を代入しておいてください。
からインクルードされます。
vbs_inc.vbs は、
vbs_inc.vbs の中で次の変数を設定(再設定)してください。
サンプル
←
▼
▲
メイン・スクリプトのグローバル変数は、start of lib include 〜 end of lib include
の間にある、設定値を格納する場所で Dim/New してください。
Dim g_Test
Function InitializeModule
Set g_Test = New TestScript
End Function
Dim g_InitializeModule
Set g_InitializeModule = GetRef( "InitializeModule" )
'--- start of vbslib include -----------------------------
:
'--- start of parameters for vbslib include -------
:
g_CommandPrompt = 1
Dim g_ObjectA : Set g_ObjectA = New ObjectA
'--- end of parameters for vbslib include --------------
:
'--- end of vbslib include -------------------------------
ライブラリ・スクリプトのグローバル変数は、グローバル領域で Dim して、
InitializeModule 関数の中で初期化します。
g_InitializeModule に InitializeModule 関数のリファレンスを設定します。
'--- start of vbslib include -----------------------------
:
'--- start of parameters for vbslib include -------
'--- end of parameters for vbslib include --------------
:
'--- end of vbslib include -------------------------------
←
▼
▲
AppKey.SetWritableMode F_IgnoreIfWarn
[WARNING] Out of Writable の警告が大量に出るときは、main2 の最初に次を記述してください。
main 関数を
に置き換える。 元の main 関数は、コメントアウトする。
にあるファイルをベースに vbslib フォルダを vbslib ヘッダに作成する。
g_IncludeType を、コメントアウトする。
vbslib_updater
下記の作業を自動的に行います。 ただし、手動で修正が必要な場合もあります。
一部の関数は、廃止されても移植性のために残してあるものがあります。
True に設定して、廃止される関数を呼び出すとブレークするので、見つけやすくなります。
バージョンアップを補助する
というツールを提供しています。
を追加し vbslib のバージョンを 3.0 に設定する。
vbslib ヘッダがある *.vbs ファイルに
を
vbslib_updater ツール
アプリケーション・スクリプトの修正
scriptlib フォルダの ver2 と ver3 の共存
ver2 の scriptlib フォルダの vbs_inc.vbs を vbs_inc_200.vbs に改名し、
ver3 の scriptlib フォルダを ver2 の scriptlib フォルダにコピーすると、
上書きすることなく、ver2 と ver3 を共存できます。
←
▼
▲
Sub Main( Opt as dictionary, AppKey as AppKeyClass )
vbslib を使うスクリプトは、Main から内容を記述します。
Sub Main()
echo "Hello, world!"
End Sub
'--- start of vbslib include ------------------------------
: (vbslib をインクルードして main を呼び出すコード)
: (既存のメイン・スクリプトを参照してください)
ユーザ定義関数です。
引数はあってもなくてもかまいませんが、ファイルに出力するスクリプトは、
Main 関数が呼ばれるときのカレント・フォルダーは、スクリプトがあるフォルダー
になります。 WSH を起動したときのカレント・フォルダー(作業フォルダー)は、
に入っています。
Sub Main()
テスト
→ T_NewMain1 フォルダ
→ T_NewMain2 フォルダ
vbslib_inc のみの環境
vbslib がある環境
を呼ぶ必要があります。
AppKey 引数を使った
Sub Main( Opt, AppKey )
Dim w_:Set w_=AppKey.NewWritable( "." ).Enable()
echo "Hello, world!"
End Sub
'--- start of vbslib include ------------------------------
: (vbslib をインクルードして main を呼び出すコード)
: (既存のメイン・スクリプトを参照してください)
にファイルを出力できるようにする
↓
サンプル
サンプル
main2 関数が定義されているときは呼ばれません。
Main 関数を定義しているスクリプト・ファイルの中に、
(vbslib をインクルードして Main を呼び出すコード)が必要です。
その内容は、既存のメイン・スクリプト(vbslib Prompt.vbs など)を参照してください。
のコード
関連
参考
Main 関数の外側の動き